"""日志配置"""
import logging
import sys
from pathlib import Path
from typing import Optional
from loguru import logger

def setup_logging(log_level: str = "INFO", log_dir: str = "logs"):
    """配置日志系统
    
    Args:
        log_level: 日志级别 (DEBUG, INFO, WARNING, ERROR, CRITICAL)
        log_dir: 日志文件存储目录
    """
    # 创建日志目录
    log_path = Path(log_dir)
    log_path.mkdir(parents=True, exist_ok=True)
    
    # 移除默认的logger配置
    logger.remove()
    
    # 添加控制台输出
    logger.add(
        sys.stderr,
        format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level: <8}</level> | <cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> - <level>{message}</level>",
        level=log_level,
        colorize=True
    )
    
    # 添加文件输出 - 普通日志
    logger.add(
        log_path / "app.log",
        format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {name}:{function}:{line} - {message}",
        level=log_level,
        rotation="500 MB",  # 日志文件达到500MB时轮转
        retention="10 days",  # 保留10天的日志
        compression="zip",  # 压缩旧日志
        encoding="utf-8"
    )
    
    # 添加错误日志文件
    logger.add(
        log_path / "error.log",
        format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {name}:{function}:{line} - {message}",
        level="ERROR",
        rotation="100 MB",
        retention="30 days",
        compression="zip",
        encoding="utf-8"
    )
    
    logger.info(f"日志系统初始化完成，日志级别: {log_level}")
    logger.info(f"日志文件目录: {log_path.absolute()}")


def get_logger(name: Optional[str] = None):
    """获取logger实例
    
    Args:
        name: logger名称，通常使用模块名
        
    Returns:
        logger实例
    """
    if name:
        return logger.bind(name=name)
    return logger


# 标准库日志适配器
class InterceptHandler(logging.Handler):
    """将标准库logging重定向到loguru"""
    
    def emit(self, record):
        # 获取对应的loguru级别
        try:
            level = logger.level(record.levelname).name
        except ValueError:
            level = record.levelno
        
        # 查找调用者信息
        frame, depth = logging.currentframe(), 2
        while frame and frame.f_code.co_filename == logging.__file__:
            frame = frame.f_back
            depth += 1
        
        logger.opt(depth=depth, exception=record.exc_info).log(level, record.getMessage())


def setup_stdlib_logging():
    """配置标准库logging使用loguru"""
    # 拦截标准库logging
    logging.basicConfig(handlers=[InterceptHandler()], level=0, force=True)
    
    # 拦截第三方库的日志
    for name in ["uvicorn", "uvicorn.error", "uvicorn.access", "chainlit", "langchain"]:
        logging.getLogger(name).handlers = [InterceptHandler()]


# 使用示例
if __name__ == "__main__":
    # 设置日志
    setup_logging(log_level="DEBUG")
    setup_stdlib_logging()
    
    # 测试日志输出
    logger.debug("这是一条调试信息")
    logger.info("这是一条信息")
    logger.warning("这是一条警告")
    logger.error("这是一条错误")
    logger.success("这是一条成功信息")
    
    # 测试带参数的日志
    logger.info("用户 {} 执行了操作 {}", "张三", "债券分析")
    